Technology exists for partitioning a program into components and distributing those components to the computing resources of an execution environment. For example, the execution environment may include a collection of processing cores associated with a single computing device, or a collection of servers associated with a computing cluster, and so on. The computing resources that are invoked can then execute the components in distributed and parallel fashion. This technology may expedite the execution of the user program, especially in those scenarios in which the program involves the processing of a large amount of data.
However, the above-described execution approach complicates the execution of a program. This added complexity, in turn, may lead to errors in the execution of the program which are difficult to identify and fix. Among other possible negative consequences, such runtime errors are “expensive” because they waste computer resources; further, the errors may require substantial debugging effort to correct.